#coding:utf-8

'''
Gabor滤波器参数可视化
参考：https://blog.csdn.net/lhanchao/article/details/55006663

https://cloud.tencent.com/developer/article/1123700
'''

import cv2
import math
import numpy as np
import os
import matplotlib.pyplot as plt

import detector

# https://cloud.tencent.com/developer/article/1123700
#构建GABOR滤波器

def gen_params_set():
    params_set = []
    ksize = 500                                                                 #gabor尺度 这里是一个
    for theta in np.arange(0, np.pi, np.pi / 4):                               #gabor方向 0 45 90 135 角度尺度的不同会导致滤波后图像不同
        params = {'ksize':(ksize, ksize), 
                  'sigma':30, 
                  'theta':theta,                                # theta代表条纹旋转角度
                  'lambd':73,                                   # lambd为波长 波长越大 条纹越大
                  'gamma':0.2,                                  # gamma越大核函数图像越小，条纹数不变，sigma越大 条纹和图像都越大
                  'psi':0,                                   # psi 是相位偏移 psi这里接近0度以白条纹为中心，180度时以黑条纹为中心
                  'ktype':cv2.CV_32F}
        params_set.append(params)
    return params_set

# 这个函数实现在一个角度范围里产生一系列卷积核
# 用于在图片边缘检测竖向线条的方向
def gen_params_set_theta_range(begin, end, step):
    params_set = []
    ksize = 100                                                                 #gabor尺度 这里是一个
    for theta in np.arange(begin, end, step):                               #gabor方向 0 45 90 135 角度尺度的不同会导致滤波后图像不同
        params = {'ksize':(ksize, ksize), 
                  'sigma':5, 
                  'theta':theta,                                # theta代表条纹旋转角度
                  'lambd':8,                                   # lambd为波长 波长越大 条纹越大
                  'gamma':1,                                  # gamma越大核函数图像越小，条纹数不变，sigma越大 条纹和图像都越大
                  'psi':0,                                   # psi 是相位偏移 psi这里接近0度以白条纹为中心，180度时以黑条纹为中心
                  'ktype':cv2.CV_32F}
        params_set.append(params)
    return params_set

def gen_params_string(params):
    params_fstring = "ksize: {}".format(params['ksize'])
    params_fstring += "sigma: {}".format(params['sigma'])
    params_fstring += " theta: {:.3f}".format(params['theta'])
    params_fstring += " lambd: {}\n".format(params['lambd'])
    params_fstring += "gamma: {}".format(params['gamma'])
    params_fstring += " psi: {}".format(params['psi'])
    # params_fstring += " ktype: {}".format(params['ktype'])
    return params_fstring

def build_filters(params_set):
    """ returns a list of kernels in several orientations
    """
    filters = []
    for params in params_set:                                                                                                         
        kern = cv2.getGaborKernel(**params)                 # 创建内核
        kern /= 1.5*kern.sum()
        filters.append((kern,params))
    return filters                                  


if __name__ == "__main__":
    params_set = gen_params_set()
    filters = build_filters(params_set)
    kern_array = [item[0] for item in filters]
    params_array = [item[1] for item in filters]
    params_fstring_array = []
    for params in params_array:
        params_fstring_array.append(gen_params_string(params))

    detector.display_imgs(kern_array, params_fstring_array,num_cols=2)

    



    

